// components/search/index.js
import {keywordModel} from "../../models/keyword.js";
import {BookModel} from "../../models/book.js";
import {paginationBev} from "../behaviors/pagination.js";

const wordModel = new keywordModel()
const bookModel = new BookModel()

Component({
    /**
     * 是用于组件间代码共享的特性
     */
    behaviors: [paginationBev],

    /**
     * 组件的属性列表
     */
    properties: {
        hotKeywords: Array,
        more: {
            type: Number,
            observer: 'loadMore'
        }
    },

    /**
     * 组件的初始数据
     */
    data: {
        historyWords: [],
        hotKeywords: [],
        searchValue: '',
        searching: false,
        loadingCenter: false
    },

    /**
     * 组件生命周期函数，在组件实例进入页面节点树时执行
     */
    attached() {
        this.setData({ //获取缓存中搜索的数组值
            historyWords: wordModel.getHistory()
        })
    },

    /**
     * 组件的方法列表 带有下划线_的方法 皆为函数内部私有方法
     */
    methods: {
        loadMore() { // 上拉加载更多方法
            if (!this.data.searchValue) { // 如果没有搜索内容，则不执行方法
                return
            }

            if (this.isLocked()) { // 如果上拉加载状态锁住，则不执行方法
                return
            }

            if (this.hasMore()) { // 有更多数据，则继续执行请求
                this.locked() // 设置上拉加载状态为锁住
                bookModel.search(this.data.searchValue, this.getCurrentStart())
                    .then(res => {
                        this.setNewData(res.books) // 数据赋值方法
                        this.unLocked() // 设置上拉加载状态为解锁
                    })
                    .catch(() => {
                        this.unLocked() // 设置上拉加载状态为解锁
                    })
            }
        },

        onCancel(e) {
            this.initialize() // 清空上次搜索结果数据
            this.triggerEvent('cancel')
        },

        onDelete(e) {
            this._closeResult() // 隐藏搜索结果列表
            this._bindValue() // 清空输入框的值
        },

        onConfirm(e) {
            this._showResult() // 显示搜索结果列表
            this.initialize() // 清空上次搜索结果数据
            this._showLoadingCenter()
            const keyword = e.detail.value || e.detail.content
            this._bindValue(keyword) // 将点击标签的值，绑定到input输入框中
            bookModel.search(keyword, 0).then(res => {
                this.setNewData(res.books) // 数据赋值方法
                this._hideLoadingCenter()
                this.setTotal(res.total) // 设置服务器返回数组的总长度
                wordModel.addToHistory(keyword)
            })
        },

        _bindValue(text) { // 输入框赋值
            this.setData({
                searchValue: text ? text : ''
            })
        },

        _showLoadingCenter() { // 显示加载load效果
            this.setData({
                loadingCenter: true
            })
        },

        _hideLoadingCenter() { // 隐藏加载load效果
            this.setData({
                loadingCenter: false
            })
        },

        _showResult() { // 显示搜索列表
            this.setData({
                searching: true,
            })
        },

        _closeResult() { // 隐藏搜索列表
            this.initialize() // 清空上次搜索结果数据
            this.setData({
                searching: false,
            })
        }
    }
})
